import random

import numpy as np

class Env_a3c:
    """
    移动计算卸载策略：根据其余mec的剩余计算资源（其他相关数据），综合考虑最佳
    """
    """
        obs具有以下结构：
                [
                    mec1: [ue1: [task1:[],task2[],task3[]], 
                           ue2: [task1:[],task2[],task3[]], 
                           ue3: [task1:[],task2[],task3[]], 
                           ue4: [task1:[],task2[],task3[]]],
                    mec2: [ue1: [task1:[],task2[],task3[]], 
                           ue2: [task1:[],task2[],task3[]], 
                           ue3: [task1:[],task2[],task3[]], 
                           ue4: [task1:[],task2[],task3[]]],
                    mec3: [ue1: [task1:[],task2[],task3[]], 
                           ue2: [task1:[],task2[],task3[]], 
                           ue3: [task1:[],task2[],task3[]], 
                           ue4: [task1:[],task2[],task3[]]],
                    mec4: [ue1: [task1:[],task2[],task3[]], 
                           ue2: [task1:[],task2[],task3[]], 
                           ue3: [task1:[],task2[],task3[]], 
                           ue4: [task1:[],task2[],task3[]]],
                ]
        环境包含4个mec
            mec = obs[i]
        每个mec最多包含4个用户,最多可以连接4个用户：
            ue = mec[i]
        每个用户具有以下结构：每个用户最多有三项任务需要计算
            ue = task[i]
        每项任务有以下几个指标结构：
            task = [I,M, F, T, R, S]
            其中I表示用户此项任务是否被卸载到了此mec，用于观察一项任务被卸载到了哪个mec。1为是，0为否
            M表示用户任务计算量（任务数量大小），若M = 0 代表此用户不存在，随机在[100, 150] MB
            F表示用户任务所需计算资源（mec能够执行任务所需的最小计算资源），
            T表示用户最长等待时延,在10s-20s间
            S表示任务是否正在计算，当Si != 0时表示任务正在计算，此时针对uei的动作不生效，该用户占用的资源仍保留，只计算其他用户的消耗
            The size of the task is randomly assigned at the range of [100, 150] MB
            and fi = εMi is the required computation resource, where ε is randomly set from [0.4, 0.5] Gcycles/MB.
            Tmax ~ (10s, 20s)
                e.g.:
                    [
                        [
                            [
                                [1,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0, 130, 50, 90, 0]
                            ],
                            [
                                [0,90, 30, 70, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ],
                            [
                                [0,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ],
                            [
                                [0,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ]
                        ],
                        [
                            [
                                [1,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0, 130, 50, 90, 0]
                            ],
                            [
                                [0,90, 30, 70, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ],
                            [
                                [0,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ],
                            [
                                [0,100, 40, 80, 0],
                                [0, 0, 0, 0, 0],
                                [0,130, 50, 90, 0]
                            ]
                        ],
                        。。。。。。
                    ]

                MEC性能：
                    计算容量C
    """
    def __init__(self):
        # todo
        self.observation_space_shape = (1, 40)
        # 创建多维数组
        self.obs = np.zeros((4, 4, 3, 5))
        self.actions = self.initActionSpace(8, 2)
        self.action_space_num = 256
        self.mec_capality = 500
        self.mec_computeablity = 25
        self.mec_uelist = []
        self.mec_uenum = [0, 0]
        self.transmission_rate = 10
        self.user_c_local = 8
        self.local_consume = []
        self.rewards = 0
        self.time = 0
        